Skip to content

Instantly share code, notes, and snippets.

@Aldlevine
Last active July 21, 2019 13:45
Show Gist options
  • Save Aldlevine/3f716f447322edbb3671 to your computer and use it in GitHub Desktop.
Save Aldlevine/3f716f447322edbb3671 to your computer and use it in GitHub Desktop.
window.performance.now --- polyfill
(function(){
// performance.now already exists
if(window.performance && window.performance.now)
return;
// performance exists and has the necessary methods to hack out the current DOMHighResTimestamp
if(
window.performance &&
window.performance.timing &&
window.performance.timing.navigationStart &&
window.performance.mark &&
window.performance.clearMarks &&
window.performance.getEntriesByName
){
window.performance.now = function(){
window.performance.clearMarks('__PERFORMANCE_NOW__');
window.performance.mark('__PERFORMANCE_NOW__');
return window.performance.getEntriesByName('__PERFORMANCE_NOW__')[0].startTime;
};
return;
}
// All else fails, can't access a DOMHighResTimestamp, use a boring old Date...
window.performance = window.performance || {};
var start = (new Date()).valueOf();
window.performance.now = function(){
return (new Date()).valueOf() - start;
};
})();
@jalbam
Copy link

jalbam commented Jul 21, 2019

Hello,

I have mixed this polyfill with Paul Irish's (https://gist.github.com/paulirish/5438650) and modifier some code:

'use strict';

// @license http://opensource.org/licenses/MIT
// copyright Paul Irish 2015
// Added code by Aaron Levine from: https://gist.github.com/Aldlevine/3f716f447322edbb3671
// Some modifications by Joan Alba Maldonado.
// as Safari 6 doesn't have support for NavigationTiming, we use a Date.now() timestamp for relative values
// if you want values similar to what you'd get with real perf.now, place this towards the head of the page
// but in reality, you're just getting the delta between now() calls, so it's not terribly important where it's placed
// Gist: https://gist.github.com/jalbam/cc805ac3cfe14004ecdf323159ecf40e
// TODO: Think about adding vendor prefixes.
if (!Date.now) { Date.now = function() { return new Date().getTime(); } }
(function()
{
	if (window.performance && window.performance.now) { return; }

	window.performance = window.performance || {};

	if
	(
		window.performance.timing && window.performance.timing.navigationStart &&
		window.performance.mark &&
		window.performance.clearMarks &&
		window.performance.getEntriesByName
	)
	{
		window.performance.now = function()
		{
			window.performance.clearMarks('__PERFORMANCE_NOW__');
			window.performance.mark('__PERFORMANCE_NOW__');
			return window.performance.getEntriesByName('__PERFORMANCE_NOW__')[0].startTime;
		};
	}
	else if ("now" in window.performance === false)
	{
		var nowOffset = Date.now();

		if (window.performance.timing && window.performance.timing.navigationStart)
		{
			nowOffset = window.performance.timing.navigationStart
		}

		window.performance.now = function now()
		{
			return Date.now() - nowOffset;
		}
	}
})();

I have placed it in this gist: https://gist.github.com/jalbam/cc805ac3cfe14004ecdf323159ecf40e

Any comments will be welcome. Thank you very much.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment